package cn.kooki.app.duobao.core;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import cn.kooki.app.duobao.data.Bean.Index.BannerResponse;
import cn.kooki.app.duobao.data.Bean.Index.IndexGoodResponse;
import cn.kooki.app.duobao.data.Bean.Index.NoticeResponse;
import cn.kooki.app.duobao.data.Bean.Result.LortteryResponse;
import cn.kooki.app.duobao.data.Bean.Result.ResultItem;
import cn.kooki.app.duobao.data.Bean.User.AddressListResponse;
import cn.kooki.app.duobao.data.Bean.User.LoginResponse;
import cn.kooki.app.duobao.data.Bean.User.LoginType;
import cn.kooki.app.duobao.data.Bean.User.UserPointStatusResponse;
import cn.kooki.app.duobao.data.Bean.User.address.AddressResponse;
import cn.kooki.app.duobao.data.Bean.User.bouns.BounsResponse;
import cn.kooki.app.duobao.data.Bean.User.pay.PayCallBackResponse;
import cn.kooki.app.duobao.data.Bean.User.pay.PayListResponse;
import cn.kooki.app.duobao.data.Bean.User.pay.PayResponse;
import cn.kooki.app.duobao.data.Bean.User.pay.PayTypeRes;
import cn.kooki.app.duobao.data.Bean.User.record.RecordResponse;
import cn.kooki.app.duobao.data.Bean.User.win.WinRecordResponse;
import cn.kooki.app.duobao.data.Bean.base.BaseResponse;
import cn.kooki.app.duobao.data.Bean.base.CheckResponse;
import cn.kooki.app.duobao.data.Bean.detail.CodeResponse;
import cn.kooki.app.duobao.data.Bean.detail.GoodDetailResponse;
import cn.kooki.app.duobao.data.Bean.detail.JionResponse;
import cn.kooki.app.duobao.data.Bean.detail.OtherItemResponse;
import cn.kooki.app.duobao.data.Bean.search.SearchResponse;
import cn.kooki.app.duobao.data.Bean.share.NotShareResponse;
import cn.kooki.app.duobao.data.Bean.share.ShareListItem;
import cn.kooki.app.duobao.data.Bean.share.ShareResponse;
import cn.kooki.app.duobao.data.constant.Constants;

import retrofit.Callback;
import retrofit.http.Body;
import retrofit.http.Field;
import retrofit.http.FieldMap;
import retrofit.http.FormUrlEncoded;
import retrofit.http.GET;
import retrofit.http.Multipart;
import retrofit.http.POST;
import retrofit.http.Part;
import retrofit.http.Path;
import retrofit.http.Query;
import retrofit.mime.MultipartTypedOutput;
import retrofit.mime.TypedFile;
import retrofit.mime.TypedString;

/**
 * Created by xiong on 2015/12/13.
 */
public interface APIService {

    /**
     * 商品列表
     *
     * @param page   分页页数
     * @param others 参数
     * @param cb     回调
     */
    @FormUrlEncoded
    @POST(Constants.SHOPLIST)
    void goodRespone(@Field("page") int page, @FieldMap HashMap<String, Object> others, Callback<IndexGoodResponse> cb);

    /**
     * 商品详情
     *
     * @param id    商品id
     * @param qishu 期数
     * @param cb    回调
     */
    @FormUrlEncoded
    @POST(Constants.GOODS_DETAIL)
    void getdetail(@Field("id") String id, @Field("qishu") String qishu, @FieldMap HashMap<String, String> others, Callback<GoodDetailResponse> cb);


    /***
     * 获取支付方式
     *
     * @param cb
     */
    @GET(Constants.PAY_TYPE)
    void getpayType(Callback<BaseResponse> cb);


    /**
     * 注册
     *
     * @param type    类型
     * @param regtype 注册平台 3。IOS 4.安卓
     * @param cb
     */
    @FormUrlEncoded
    @POST(Constants.REGISTER)
    void register(@Field("type") int type, @Field("regtype") int regtype, @FieldMap HashMap<String, Object> othermap,
                  Callback<LoginResponse> cb);

    /**
     * 登录
     *
     * @param username  用户名
     * @param password  密码
     * @param type      类型 1.网站 2.QQ 3.微信
     * @param logintype 3.IOS 4.安卓
     * @param cb        回调
     */
    @FormUrlEncoded
    @POST(Constants.LOGIN)
    void login(@Field("username") String username, @Field("password") String password,
               @Field("type") int type,
               @Field("logintype") int logintype,
               Callback<LoginResponse> cb);

    /**
     * 搜索
     *
     * @param key      关键字
     * @param callback
     */
    @FormUrlEncoded
    @POST(Constants.SHOPLIST)
    void search(@Field("key") String key, Callback<SearchResponse> callback);


    /**
     * 获取收获地址
     *
     * @param uid 用户id
     */
    @FormUrlEncoded
    @POST(Constants.ADDRESS)
    void listaddress(@Field("uname") String uid, Callback<AddressListResponse> callback);

    /**
     * 添加收货地址
     *
     * @param uid        用户id
     * @param id         地址id 添加为0
     * @param sheng      省份
     * @param shi        市
     * @param xian       县
     * @param jiedao     详细街道
     * @param Youbian    邮编
     * @param Shouhuoren 收货人
     * @param Shouji     手机
     * @param Qq         qq
     * @param dianhua    电话
     * @param Moren      是否默认
     * @param callback   回调方法
     */
    @FormUrlEncoded
    @POST(Constants.ADD_ADDRESS)
    void addaddress(@Field("uname") String uid, @Field("ID") int id, @Field("Sheng") String sheng,
                    @Field("Shi") String shi,
                    @Field("xian") String xian,
                    @Field("jiedao") String jiedao,
                    @Field("Youbian") String Youbian,
                    @Field("Shouhuoren") String Shouhuoren,
                    @Field("Shouji") String Shouji,
                    @Field("Qq") String Qq,
                    @Field("dianhua") String dianhua,
                    @Field("Moren") boolean Moren,
                    Callback<BaseResponse> callback
    );


    /**
     * 添加收货地址
     *
     * @param map      参数map
     * @param callback 回调方法
     */
    @FormUrlEncoded
    @POST(Constants.ADD_ADDRESS)
    void addaddress(@FieldMap Map<String, Object> map,
                    Callback<BaseResponse> callback
    );

    /**
     * 获取验证码
     *
     * @param mobile   手机号
     * @param callback 回调
     */
    @FormUrlEncoded
    @POST(Constants.GET_CODE)
    void getcode(@Field("mobile") String mobile, Callback<BaseResponse> callback);


    /**
     * 最新揭晓
     *
     * @param callback
     */
    @FormUrlEncoded
    @POST(Constants.LORTTERY_LIST)
    void listresult(@Field("page") int page, Callback<LortteryResponse> callback);

    /**
     * 获取夺宝记录
     *
     * @param sid      商品id
     * @param qishu    当前期数
     * @param page     分页页数 int
     * @param callback 回调方法
     */
    @FormUrlEncoded
    @POST(Constants.SHOP_VIEW_RECORD_LIST)
    void listshopRecord(@Field("sid") String sid, @Field("qishu") String qishu, @Field("page") int page, Callback<JionResponse> callback);


    /**
     * 红包列表
     *
     * @param uname    用户uid
     * @param type     红包类别type 1：未使用 2:已使用或到期
     * @param page     分页
     * @param callback 回调方法
     */
    @FormUrlEncoded
    @POST(Constants.BONUS)
    void listbonus(@Field("uname") String uname, @Field("type") int type, @Field("page") int page, @Field("money") String money, Callback<BounsResponse> callback);


    /**
     * 支付列表
     *
     * @param uname    用户uid
     * @param page     分页
     * @param callback 回调
     */
    @FormUrlEncoded
    @POST(Constants.PAY_LIST)
    void listpaylist(@Field("uname") String uname, @Field("page") int page, Callback<BaseResponse> callback);


    /**
     * 夺宝列表
     *
     * @param uname    用户uid
     * @param type     类型
     * @param page     分页
     * @param callback 回调
     */
    @FormUrlEncoded
    @POST(Constants.RECORD_LIST)
    void listduobaorecord(@Field("uname") String uname, @Field("type") int type, @Field("page") int page, Callback<RecordResponse> callback);

    /**
     * 晒单列表
     *
     * @param uname    用户uid 为空时为全部
     * @param callback 回调
     */
    @FormUrlEncoded
    @POST(Constants.SHARE_LIST)
    void listShare(@Field("uname") String uname, @Field("page") int page, Callback<ShareResponse> callback);


    /**
     * 添加晒单
     *
     * @param multipartTypedOutput
     * @param baseCallback
     */
    @POST(Constants.ADD_SHARE)
    void addshare(@Body MultipartTypedOutput multipartTypedOutput,
                  Callback<BaseResponse> baseCallback);


    /**
     * 地区城市
     *
     * @param pid      父级id
     * @param callback 回调
     */
    @FormUrlEncoded
    @POST(Constants.CITY_LIST)
    void listCitys(@Field("pid") String pid, Callback<AddressResponse> callback);


    /**
     * 删除收货地址
     *
     * @param uid      用户id
     * @param id       地址id
     * @param callback 回调
     */
    @FormUrlEncoded
    @POST(Constants.DEL_ADDRESS)
    void deleteAddress(@Field("uname") String uid, @Field("id") String id, Callback<BaseResponse> callback);


    /***
     * 获取用户信息
     *
     * @param uid      用户id
     * @param callback 回调
     */
    @FormUrlEncoded
    @POST(Constants.USERINFO)
    void getuserinfo(@Field("uname") String uid, Callback<LoginResponse> callback);


    /***
     * 获取中奖纪录
     *
     * @param uid      用户id
     * @param callback 回调
     */
    @FormUrlEncoded
    @POST(Constants.WINNING_LIST)
    void winlist(@Field("uname") String uid, @Field("page") int page, Callback<WinRecordResponse> callback);


    @GET(Constants.INDEX_NOTICE)
    void noticelist(Callback<NoticeResponse> callback);

    /***
     * 获取推荐列表
     *
     * @param callback 回调
     */

    @GET(Constants.TUIJIAN_LIST)
    void tuijianlist(Callback<IndexGoodResponse> callback);

    /***
     * 获取推荐列表
     *
     * @param callback 回调
     */

    @GET(Constants.BANNER_IMG)
    void bannerurls(Callback<BannerResponse> callback);


    @FormUrlEncoded
    @POST(Constants.CHARGE)
    void charge(@Field("uid") String uid, @Field("ip") String ip, @Field("regtype") int regtype,
                @Field("money") String money, @Field("type") int type, Callback<PayResponse> callback);


    /**
     * 获取充值记录
     *
     * @param uname    用户名
     * @param page     分页
     * @param callback 回调
     */
    @FormUrlEncoded
    @POST(Constants.PAY_LIST)
    void charerecordlist(@Field("uname") String uname, @Field("page") int page, Callback<PayListResponse> callback);


    /**
     * 下订单
     *
     * @param json     订单json
     * @param uname    用户id
     * @param callback 回调
     */
    @FormUrlEncoded
    @POST(Constants.PAY)
    void payorder(@Field("data") String json, @Field("uname") String uname, @Field("regtype") int type, Callback<PayResponse> callback);


    /**
     * 修改昵称
     *
     * @param name     昵称
     * @param uname    用户id
     * @param callback 回调
     */
    @FormUrlEncoded
    @POST(Constants.USER_MODNAME)
    void modeNick(@Field("name") String name, @Field("uname") String uname, Callback<BaseResponse> callback);


    /**
     * 往期揭晓
     *
     * @param id       id
     * @param page     页码
     * @param callback 回调
     */
    @FormUrlEncoded
    @POST(Constants.WINRECORDFORGOOD)
    void goodetailWinRecord(@Field("cid") String id, @Field("page") int page, Callback<OtherItemResponse> callback);


    /**
     * 我的晒单
     *
     * @param uname    用户id
     * @param page     页码
     * @param callback 回调
     */
    @FormUrlEncoded
    @POST(Constants.SHARE_LIST_MY)
    void getShareListMy(@Field("uname") String uname, @Field("page") int page, Callback<ShareResponse> callback);


    /**
     * 获取夺宝记录号码列表
     *
     * @param uname
     * @param id
     * @param qishu
     * @param callback
     */
    @FormUrlEncoded
    @POST(Constants.RECORDUSERLIST)
    void getRecordCordList(@Field("uname") String uname, @Field("id") String id, @Field("qishu") String qishu, Callback<CodeResponse> callback);


    /**
     * 检查用户是否注册
     *
     * @param mobile   是否注册
     * @param callback
     */
    @FormUrlEncoded
    @POST(Constants.CHECK_USER)
    void checkUser(@Field("mobile") String mobile, Callback<BaseResponse> callback);

    @FormUrlEncoded
    @POST(Constants.RECORD_NOT_SHARE)
    void getRecordNotShare(@Field("uname") String name, Callback<NotShareResponse> callback);

    /**
     * 支付回调接口
     *
     * @param uid      用户uid
     * @param code     订单号
     * @param type     支付类型:2:充值 1:支付
     * @param callback
     */
    @FormUrlEncoded
    @POST(Constants.PAY_CALLBACK)
    void paycallback(@Field("uname") String uid, @FieldMap HashMap<String, Object> dingdan, @Field("type") int type, Callback<PayCallBackResponse> callback);

    /**
     * 用户头像修改
     *
     * @param uid      用户uid
     * @param img      头像文件
     * @param callback 回调
     */
    @Multipart
    @POST(Constants.USERICON_CHANGE)
    void userIconChange(@Part("uname") TypedString uid, @Part("img") TypedFile img, Callback<BaseResponse> callback);


    /***
     * 绑定手机号码
     *
     * @param uid
     * @param code
     * @param mobile
     * @param callback
     */
    @FormUrlEncoded
    @POST(Constants.BIND_PHONE)
    void binphone(@Field("uname") String uid, @Field("code") String code, @Field("mobile") String mobile, Callback<BaseResponse> callback);

    @FormUrlEncoded
    @POST(Constants.UPLOAD_CONTACTS)
    void uploadContacts(@Field("uname") String uid, @Field("data") String datajson, Callback<BaseResponse> callback);

    /**
     * 每日签到
     *
     * @param type
     * @param uname
     * @param callback
     */
    @FormUrlEncoded
    @POST(Constants.USER_POINTS)
    void userPoints(@Field("type") int type, @Field("uname") String uname, Callback<BaseResponse> callback);

    @FormUrlEncoded
    @POST(Constants.USER_POINTS_STATUS)
    void getPotionsStatus(@Field("uname") String uname, Callback<UserPointStatusResponse> callback);

    @GET(Constants.CHECK_VERSION)
    void checkVersion(Callback<CheckResponse> callback);



    @FormUrlEncoded
    @POST(Constants.IS_ONE_BONUS)
    void IsOneBonus(@Field("uname") String uid, @Field("type") int type, Callback<BaseResponse> callback);


    /***
     * 送红包
     *
     * @param uname    用户uid
     * @param type     type 分享送红包type = 8
     * @param callback
     */
    @FormUrlEncoded
    @POST(Constants.POST_BONUS)
    void postBonus(@Field("uname") String uname, @Field("type") int type, Callback<BaseResponse> callback);


    /**
     * 登录控制
     *
     * @param callback
     */
    @GET(Constants.LOGIN_TYPE_SWITCH)
    void getlogintype(Callback<LoginType> callback);

    /**
     * 支付控制
     *
     * @param callback
     */
    @GET(Constants.PAY_TYPE)
    void getPayType(Callback<PayTypeRes> callback);





}
